﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ContactManagement.App_GlobalResources;
using ContactManagement.AppCode;
using EFDataModel;
using EFDataModel.Enums;

namespace ContactManagement.Models
{
    /// <summary>
    /// Benutzer bearbeiten für den Administrator, vom normalen User ableiten, hier stehen einfach ein paar weitere Felder zur Verfügung.
    /// </summary>
    public class EditUserAdminModel : EditUserModel,  IDynamicData
    {
        #region Member
        /// <summary>
        /// Die Dynamischen Daten die angezeigt werden sollen für den aktuellen Da
        /// </summary>
        public IEnumerable<EFDynamicData> DynamicData { get; set; }

        /// <summary>
        /// Benutzername (Email)
        /// Hier darf keine Remoteprüfung des LoginNamens vorgenommen werden, das geschieht dann auf dem Server
        /// </summary>
        [Display(Name = "LoginnameRESX", ResourceType = typeof(AccountViews))]
        [Required]
        [StringLength(75)]
        [RegularExpression(WebConstants.EmailRegularExpString, ErrorMessageResourceName = "InvalidEMailAddressRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        public new string UserName { get; set; }

        /// <summary>
        /// Bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(Name = "UserCategoryRESX", ResourceType = typeof(AccountViews))]
        public IEnumerable<SelectListItem> Categories
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (var eItem in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<UserCategory>())
                {
                    items.Add(new SelectListItem { Value = eItem.ID.ToString(), Text = eItem.Name });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Die Category der in der Oberfläche ausgewählt wird (der Value) wird in dieser variable abgelegt, d.h. wenn kein Wert ausgewählt wurde
        /// dann wird auch die hier angegebene Fehlermeldung auf der Oberfläche angezeigt. Wird auch benutzt um die currentselection der Dropdownliste anzuzeigen,
        /// da das Property Selected des SelectedListItem nicht funktioniert!
        /// </summary>
        [Required(ErrorMessageResourceName = "SelectCategoryRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        [Display(Name = "UserCategoryRESX", ResourceType = typeof(AccountViews))]
        public string Category { get; set; }

        /// <summary>
        /// Bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(Name = "UserTypeRESX", ResourceType = typeof(AccountViews))]
        public IEnumerable<SelectListItem> UserTypes
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (var eItem in EFUser.UserTypes())
                {
                    //Superuser kann nicht festgelegt werden, dieser wird nur bei der Installation erstellt.
                    if (eItem.Key == EUserTypes.SuperUser)
                    {
                        continue;
                    }

                    items.Add(new SelectListItem { Value = ((int)eItem.Key).ToString(), Text = eItem.Value });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Der Wert für den Aktuellen UserType, welcher für UserTypes Auflistung benötigt wird.
        /// </summary>
        [Display(Name = "UserTypeRESX", ResourceType = typeof(AccountViews))]
        public string UserType { get; set; }

        /// <summary>
        /// Ist der User aktiv oder "gesperrt" (deaktiviert)
        /// </summary>
        [Display(Name = "IsActiveRESX", ResourceType = typeof(AccountViews))]
        public bool IsActiveUser { get; set; }

        /// <summary>
        /// Anzahl der Logintries
        /// </summary>
        [Required]
        [Display(Name = "LoginTriesRESX", ResourceType = typeof(AccountViews))]
        public int Logintries { get; set; }

        /// <summary>
        /// Die Straße
        /// </summary>
        [DataType(DataType.Text)]
        [StringLength(100, MinimumLength = 2)]
        [Display(Name = "StreetRESX", ResourceType = typeof(AccountViews))]
        public string Street { get; set; }

        /// <summary>
        /// Die Postleitzahl
        /// </summary>
        [DataType(DataType.Text)]
        [StringLength(12, MinimumLength = 4)]
        [Display(Name = "ZipCodeRESX", ResourceType = typeof(AccountViews))]
        public string ZipCode { get; set; }

        /// <summary>
        /// Die Stadt
        /// </summary>
        [DataType(DataType.Text)]
        [StringLength(100, MinimumLength = 2)]
        [Display(Name = "CityRESX", ResourceType = typeof(AccountViews))]
        public string City { get; set; }

        /// <summary>
        /// Die Hausnummer
        /// </summary>
        [DataType(DataType.Text)]
        [StringLength(50, MinimumLength = 1)]
        [Display(Name = "HouseNumberRESX", ResourceType = typeof(AccountViews))]
        public string HouseNumber { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Leerer Basiskonstruktor um ein neues Objekt anzulegen.
        /// </summary>
        public EditUserAdminModel()
            : base()
        {
        }

        /// <summary>
        /// Basiskonstruktor der bereits mit Daten gefüllt wird
        /// </summary>
        /// <param name="efUser">der User der angezeigt oder bearbeitet werden soll</param>
        public EditUserAdminModel(EFUser efUser) : base(efUser)
        {
            UserName = efUser.LoginEmail;
            IsActiveUser = efUser.IsActiveUser;
            Logintries = efUser.Logintries;
            Street = efUser.DefaultAddress.Street;
            ZipCode = efUser.DefaultAddress.Zipcode;
            City = efUser.DefaultAddress.City;
            HouseNumber = efUser.DefaultAddress.HouseNumber;
            //Achtung der Int wert muss gesetzt werden und nicht der String.
            UserType = ((int)efUser.UserType).ToString();
            Category = efUser.UserCategory.ID.ToString();
            UserId = efUser.ID;

            //Hier werden alle Daten rausgesucht die für den aktuellen User in den Dynamischen Daten angezeigt werden sollen, der HTML Helper erstellt alle Eingabefelder und weißt dann die passenden Werte zu
            DynamicData = from eDynamicData in CurrentHttpContext.GetDataModel().EFDynamicDataMenge where eDynamicData.EFBaseID == efUser.ID && eDynamicData.EFDynamicDataType.ModuleId == (int) EFModules.Member select eDynamicData;
        }
        #endregion

    }
}
